#include <iostream>
using namespace std;

class A{
    protected:
        int value_a;
    public:
        A(){}
        A(int a):value_a(a){
            cout << "A 有参构造" << endl;
        }
        ~A(){
            cout << "A 析构函数" << endl;
        }
        void show(){
            cout << value_a << endl;
        }
};

class B{
    protected:
        int value_b;
    public:
        B(){}
        B(int b):value_b(b){
            cout << "B 有参构造" << endl;
        }
        ~B(){
            cout << "B 析构函数" << endl;
        }
        void show(){
            cout << value_b << endl;
        }
};

// 由A B 两个类共同派生 C类
// C类中拥有AB两个类成员
// 构造函数调用的顺序和此处的继承的书写顺序有关
class C:public B, public A{
    private:
        int value_c;
    public:
        C(){}
        // 需要在C类的构造函数的初始化表中 显性调用两个基类的构造函数
        // 构造函数调用的顺序和此处的初始化表中的书写顺序无关
        C(int a, int b, int c):A(a), B(b), value_c(c){
            cout << "C 有参构造" << endl;
        }
        ~C(){
            cout << "C 析构函数" << endl;
        }
        void show(){
            cout << value_a << " " << value_b << " " << value_c << endl;
        }
};

int main(int argc, const char *argv[]){
    C c1(10, 20, 30);
    c1.show();
    // 在多继承中 即使每个父类中都有重名的成员 访问也不会冲突
    // 因为他们也在不同的空间中 需要使用  类名:: 来区分
    c1.A::show();
    c1.B::show();
    
    return 0;
}